home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus 1995 #5 & #6
/
Amiga Plus CD - 1995 - No. 5 and 6.iso
/
pd
/
serien
/
purity
/
nr.5
/
pascal
/
pcq-programme
/
game
/
collobjekt
/
collobjekt.test.p
< prev
next >
Wrap
Text File
|
1995-04-19
|
9KB
|
283 lines
Program TestCollsion;
TYPE
Objekt = record
Ox : short; { x-Position linke obere Ecke }
Oy : short; { y-Position linke obere Ecke }
Sizex : short; { x-size }
Sizey : short; { y-size }
Speedx : short; { x-Geschwindigkeit }
Speedy : short; { y-Geschwindigkeit }
typ : short; { Objekttyp }
end;
VAR
Objekts : array[0..255] of Objekt; { Max. Anzahl der Objekte }
CONST
Objektsize : integer = sizeof(Objekt); { Größe eines Objektes }
Function CollObjekt(von, bis, x1, y1, x2, y2 : short) : short;
{ Die Funktion ermittelt, welches Objekt in dem Rechteck x1, y1, x2, y2
Kollidiert ist. Hierbei kann ein von / bis Bereich für die Objekt-
untersuchung angegeben werden (0 - 255 ).
Wird als Von-Wert -1 angegeben, so werden alle Objekte untersucht und
die erste Objektnummer, die zur Kollision führte, zurück gegeben.
Ist der Rückgabewert -1, so gab es eine Kolision mit einem nicht
definierten Objekt bzw. das Objekt wurde nicht gefunden.
}
begin
{$A
movem.l d1-d7/a0-a3,-(sp) ; alle benutzten Register sichern
; Wahnsinn, 11 Stück !!!
; Die Parameter liegen deshalb auch
; an der um +44 Korrigierten SP-Adresse
lea _Objekts,a0 ; 1. Adresse der Elemente laden
move.l _Objektsize,a1 ; Größe der Objekte laden
move.w 56(sp),d1 ; bis (Urspünglich: 12(sp))
move.w 58(sp),d2 ; von (Urspünglich: 14(sp))
cmp.w #0,d2 ; sollen alle Objekte untersucht werden ?
beq.s CollObjekt2A ; Sonderfall !!! Objekt ist 0
bmi.s CollObjekt2 ; Dann müssen alle Objekte bearbeitet werden
movea.w d2,a3 ; sichern für den Rückgabezähler
sub.w d2,d1 ; Anzahl der Objekte - 1 (für dbra)
CollObjekt1:
adda.l a1,a0 ; Basisadresse + Objektgröße
subq #1,d2 ; d2 erniedrigen
bne.s CollObjekt1 ; Tatsächliche Adresse noch nicht ermittelt
bra.s CollObjekt3 ; Steht jetzt in a0
CollObjekt2:
move.w #255,d1 ; 256 Objekte sind zu bearbeiten
move.w #0,a3 ; 1. zu bearbeitende Objektnummer
bra.s CollObjekt3 ; weiter gehts
CollObjekt2A:
move.w #0,d1 ; 1 Objekt ist zu bearbeiten
move.w #0,a3 ; 1. zu bearbeitende Objektnummer
CollObjekt3:
; a0 = Startadresse des 1. Objektes
; a1 = Größe des Objektes
; a3 = Nummer des ersten Objektes
; d1 = Anzahl der Objekte -1
move.w 48(sp),d4 ; y2 (Urspünglich: 4(sp))
move.w 50(sp),d5 ; x2 (Urspünglich: 6(sp))
move.w 52(sp),d6 ; y1 (Urspünglich: 8(sp))
move.w 54(sp),d7 ; x1 (Urspünglich: 10(sp))
CollObjektLoop:
; Ab hier beginnt die Fragerei immer wieder
move.w (a0),d2 ; Ox1-Position in D2
bmi CollObjektNext ; zur Beschleunigung der Abfrage, da Objekt
; tot ist.
move.w 2(a0),d3 ; Oy1-Position in D3
cmp.w d7,d2 ; Ox1 >= Tx1
bge.s CollObjekt4 ; Ja
bra.s CollObjekt10 ; nein
CollObjekt4:
cmp.w d5,d2 ; Ox1 <= Tx2
bls.s CollObjekt100 ; Ja
; nein, weiter bei Stufe 10
CollObjekt10:
add.w 4(a0),d2 ; Ox1 um den x-size Wert erhöhen, um Ox2 zu bekommen
cmp.w d7,d2 ; Ox2 >= Tx1
bge.s CollObjekt11 ; Ja
bra.s CollObjekt20 ; nein
CollObjekt11:
cmp.w d5,d2 ; Ox2 <= Tx2
bls.s CollObjekt100 ; Ja
; nein, weiter bei Stufe 20
CollObjekt20:
move.w (a0),d2 ; Ox1 wieder auf den alten Wert bringen
cmp.w d2,d7 ; Tx1 >= Ox1
bge.s CollObjekt21 ; Ja
bra.s CollObjekt30 ; nein
CollObjekt21:
add.w 4(a0),d2 ; Ox1 um den x-size Wert erhöhen, um Ox2 zu bekommen
cmp.w d2,d7 ; Tx1 <= Ox2
bls.s CollObjekt100 ; Ja
; nein, weiter bei Stufe 30
CollObjekt30:
move.w (a0),d2 ; Ox1 wieder auf den alten Wert bringen
cmp.w d2,d5 ; Tx2 >= Ox1
bge.s CollObjekt31 ; Ja
bra CollObjektNext ; nein, also kein Treffer
CollObjekt31:
add.w 4(a0),d2 ; Ox1 um den x-size Wert erhöhen, um Ox2 zu bekommen
cmp.w d2,d5 ; Tx1 <= Ox2
bls.s CollObjekt100 ; Ja
bra CollObjektNext ; nein, also kein Treffer
CollObjekt100:
cmp.w d6,d3 ; Oy1 >= Ty1
bge.s CollObjekt101 ; Ja
bra.s CollObjekt110 ; nein
CollObjekt101:
cmp.w d4,d3 ; Oy1 <= Ty2
bls.s CollObjekt200 ; Ja
; nein, weiter bei Stufe 110
CollObjekt110:
add.w 6(a0),d3 ; Oy1 um den y-size Wert erhöhen, um Oy2 zu bekommen
cmp.w d6,d3 ; Oy2 >= Ty1
bge.s CollObjekt111 ; Ja
bra.s CollObjekt120 ; nein
CollObjekt111:
cmp.w d4,d3 ; Oy2 <= Ty2
bls.s CollObjekt200 ; Ja
; nein, weiter bei Stufe 120
CollObjekt120:
move.w 2(a0),d3 ; Oy1 wieder auf den alten Wert bringen
cmp.w d3,d6 ; Ty1 >= Oy1
bge.s CollObjekt121 ; Ja
bra.s CollObjekt130 ; nein
CollObjekt121:
add.w 6(a0),d3 ; Oy1 um den y-size Wert erhöhen, um Oy2 zu bekommen
cmp.w d3,d6 ; Ty1 <= Oy2
bls.s CollObjekt200 ; Ja
; nein, weiter bei Stufe 130
CollObjekt130:
move.w 2(a0),d3 ; Oy1 wieder auf den alten Wert bringen
cmp.w d3,d4 ; Ty2 >= Oy1
bge.s CollObjekt131 ; Ja
bra.s CollObjektNext ; nein, also kein Treffer
CollObjekt131:
add.w 6(a0),d3 ; Oy1 um den y-size Wert erhöhen, um Oy2 zu bekommen
cmp.w d3,d4 ; Tx1 <= Ox2
bls.s CollObjekt200 ; Ja
bra.s CollObjektNext ; nein, also kein Treffer
CollObjekt200:
; Alle Bedingungen sind erfüllt worden,
; also ein Treffer
move.w a3,d0 ; die getroffene Objektnummer in d0
bra.s CollObjektEnd ; und ab dafür
CollObjektNext:
; Eine oder mehrere Bedingungen wurden nicht
; erfüllt. Also das nächste Objekt.
adda.l a1,a0 ; Nächste Objektadresse
adda.w #1,a3 ; Objektnummer um eins erhöhen
dbra.s d1,CollObjektLoop ; und weiter geht's
moveq #-1,d0 ; wir haben kein passendes Objekt gefunden,
; also Fehler
CollObjektEnd:
movem.l (sp)+,d1-d7/a0-a3 ; alle benutzten Register wieder zurück
}
end;
var
ergebnis : short;
i : short;
c : char;
begin
Objekts[0].Ox := 30;
Objekts[0].Oy := 5;
Objekts[0].Sizex := 15;
Objekts[0].Sizey := 65;
Objekts[1].Ox := 25;
Objekts[1].Oy := 15;
Objekts[1].Sizex := 5;
Objekts[1].Sizey := 5;
Objekts[2].Ox := 40;
Objekts[2].Oy := 5;
Objekts[2].Sizex := 15;
Objekts[2].Sizey := 75;
Objekts[3].Ox := 5;
Objekts[3].Oy := 5;
Objekts[3].Sizex := 10;
Objekts[3].Sizey := 65;
Objekts[4].Ox := 50;
Objekts[4].Oy := 50;
Objekts[4].Sizex := 50;
Objekts[4].Sizey := 40;
Objekts[5].Ox := 200;
Objekts[5].Oy := 80;
Objekts[5].Sizex := 40;
Objekts[5].Sizey := 80;
Objekts[6].Ox := 200;
Objekts[6].Oy := 120;
Objekts[6].Sizex := 40;
Objekts[6].Sizey := 80;
for i := 7 to 255 do
Objekts[i].ox := -1;
{ Die nachfolgenden Ergebnisse waren alle O.K.}
ergebnis := CollObjekt(0,0,10,10,50,50);
writeln("CollObjekt(0,0,10,10,50,50)", ergebnis);
readln(c);
ergebnis := CollObjekt(1,1,10,10,50,50);
writeln("CollObjekt(1,1,10,10,50,50)", ergebnis);
readln(c);
ergebnis := CollObjekt(2,2,10,10,50,50);
writeln("CollObjekt(2,2,10,10,50,50)", ergebnis);
readln(c);
ergebnis := CollObjekt(3,3,10,10,50,50);
writeln("CollObjekt(3,3,10,10,50,50)", ergebnis);
readln(c);
ergebnis := CollObjekt(4,4,10,10,50,50);
writeln("CollObjekt(4,4,10,10,50,50)", ergebnis);
readln(c);
{}
ergebnis := CollObjekt(5,5,100,100,600,100);
writeln("CollObjekt(5,5,100,100,600,100)", ergebnis);
readln(c);
ergebnis := CollObjekt(-1,5,100,100,600,100);
writeln("CollObjekt(-1,5,100,100,600,100)", ergebnis);
readln(c);
ergebnis := CollObjekt(1,1,10,17,600,17);
writeln("CollObjekt(1,1,10,17,600,17)", ergebnis);
readln(c);
{ }
ergebnis := CollObjekt(6,6,100,100,600,100);
writeln("CollObjekt(6,6,100,100,600,100)", ergebnis);
readln(c);
ergebnis := CollObjekt(-1,5,100,100,600,100);
writeln("CollObjekt(-1,5,100,100,600,100)", ergebnis);
readln(c);
ergebnis := CollObjekt(-1,5,610,100,620,100);
writeln("CollObjekt(-1,5,610,100,620,100)", ergebnis);
readln(c);
{}
end.